Вы - -й посетитель этой
странички
Использование электронной таблицы Microsoft Excel и языка Visual Basic for Application для построения графиков состояния идеального газа
О.В. Туркин, Москва
Предлагаемая программа предназначена для наглядной иллюстрации первого закона термодинамики, поэтому сначала уделим немного внимания материалу из курса физики 10-го класса. Как известно, уравнение состояния идеального газа имеет вид
PV/T=mR/m (1)
где P - давление газа,
V - объем сосуда, который занимает газ,
T - температура газа по шкале Кельвина,
m - масса газа,
m - молярная масса газа,
R - универсальная газовая постоянная.
Если рассматривается один и тот же газ неизменной массы, то правая часть уравнения является постоянной.
PV/T=R0 (2)
Если мы хотим исследовать какой-либо изопроцесс, необходимо, приняв один из параметров с левой стороны уравнения за постоянную, менять два оставшихся параметра. Так при постоянном давлении можно получить уравнение изобарного процесса
V/T=R0/P (3)
и если речь идет о переходе газа из состояния с параметрами P, V1 , T1 в состояние P, V2 , T2 , то связь между этими состояниями будет иметь вид
V1/T1=V2/T2
Аналогично можно получить формулы для изохорного и изотермического процессов
P/T=R0/V
P1/T1=P2/T2 (5)
PV=R0T
P1V1 = P2V2 (6)
Известно, что эти изопроцессы могут быть изображены на графиках в координатах P-V; P-T; V-T и существует ряд задач на подобные построения, а также на переход из одной системы координат в другие. Кроме того, в школьном курсе есть задачи на построение замкнутых термодинамических циклов, состоящих из подобных процессов.
Поставим перед собой следующую цель - создать программу, которая позволяла бы строить графики газовых процессов и замкнутых циклов одновременно в трех системах координат, а также иллюстрировала бы энергетические превращения в этих процессах.
В качестве оболочки для создания такой программы используем электронную таблицу Microsoft Excel, имеющую развитые средства создания графических изображений и возможность подключения модулей на языке VBA для автоматизации процесса построения графиков.
Обсудим общий вид нашей программы и определимся с числовыми параметрами.
Сначала определяем начальное состояние газа. Как известно, при нормальных условиях газ имеет давление 100 кПа и температуру 273 К. В термодинамических расчетах обычно рассматриваются давления, не превышающие 100 атмосфер и температуры до 1000 К. Поэтому в качестве ориентировочного исходного состояния принимаем давление равным 500 кПа, температуру - 500 К и объем - 5 м 3 . Тогда, полагая отношение m/m = 1, можно значение постоянной R 0 принять равным 5. Тем не менее предусмотрим в программе возможность устанавливать исходное состояние по своему выбору, сохраняя значение постоянной.
Из параметров газа мы будем менять температуру и давление. Действительно, если говорить о реальных физических процессах, то в них, как правило, происходит либо изменение температуры газа, либо давления. В большинстве случаев изменение объема, который занимает газ, обусловлено изменением внешнего давления и, следовательно, давления газа.
Далее следует определить шаг, с которым будут изменяться выбранные параметры. Практически оказалось удобным изменять давление с шагом 20 кПа и температуру с шагом 50 градусов.
Также необходимо определиться в длительности происходящих процессов. Если, скажем, речь идет о построении замкнутого цикла, то, видимо, придется предусмотреть возможность создания различных изопроцессов в рамках одного этапа построения. Пусть у нас будет 25 таких изопроцессов. Ясно, что это число выбрано произвольно.
Переходим к созданию программы. Сначала поработаем в электронной таблице. Определяем ячейки для исходного состояния. Во второй строке блока A1:C2 будут размещены начальные значения давления, объема и температуры (этим ячейкам даны имена PPP, VVV и TTT соответственно), как это представлено в табл. 1.
Таблица 1
|
A |
B |
C |
1 |
=PPP * 100 |
=VVV |
=TTT * 100 |
2 |
5 |
5 |
5 |
В данном случае эти цифры выбраны в качестве ориентира. Перед нами же стоит задача обеспечить произвольный выбор начальных параметров. Конечно, можно было бы заполнять содержимое ячеек A2:C2 вручную, но гораздо удобнее использовать для этого такой элемент управления, как полоса прокрутки - crollBar. Этот элемент дает богатые возможности для автоматизации работы даже без применения программного кода.
Итак, внедряем на наш рабочий лист элемент управления ScrollBar (Полоса прокрутки). Для этого через пункты меню "Меню | Вид | Панели" инструментов вызываем панель элементов управления, входим в режим конструктора и перетаскиваем с этой панели на рабочий лист полосу прокрутки, причем располагаем ее в вертикальном положении.
При выделенной полосе прокрутки там же, в панели элементов управления, вызываем окно свойств и определяем:
- Минимальное и максимальное значения числа (Value), соответствующие двум крайним значениям ползунка на полосе прокрутки. Так как первая полоса будет отвечать за значение давления, а числа могут принимать только целые положительные значения, то задаем свойство Max = 1000, а свойство Min = 0.
- Используем и такое свойство, как LinkedCell (Связанная ячейка). Оно устанавливает ячейку, в которой будет отображаться значение Value. В качестве таковой выбираем J3 и, предварительно занеся в нее произвольное целое число (до 1000), в строке окна свойств LinkedCell вписываем J3.
Теперь, если при отключенном конструкторе перемещать ползунок полосы прокрутки, то значения в этой ячейке будут изменяться от 0 до 1000. Мы же определились, что в A2 значение будет меняться от 0 до 10 (?100 кПа), поэтому необходимо произвести перерасчет. В ячейку J4 заносим формулу =J3/100, а в ячейку А2 - формулу =J4.
В действительности можно было бы обойтись без J4 и сразу в А2 получить значение из J3/100, но в данном случае это будет нелишним в целях наглядности и дополнительного контроля.
Таким же образом располагаем вторую полосу прокрутки (горизонтальную), устанавливаем минимальное и максимальное значения 0 и 1000 соответственно, указываем ячейку связи K3, проводим в ячейке К4 деление на 100 и в ячейку С3 (температура, деленная на 100) заносим формулу =К4. Теперь при перемещении ползунка на горизонтальной полосе прокрутки начальное значение температуры будет изменяться.
Необходимо отметить, что физически нулевые значения температуры и давления нереализуемы, поэтому предпочтительнее установить минимальное значение не 0, а, например, 100. Но в данном случае нам важно продемонстрировать использование полосы прокрутки.
Итак, начальные давления и температура определены. Вычисляем объем по формуле (2). Для этого в таблице должно находиться значение R 0 = 5. Занесем в ячейку H2 число 5 (это значение газовой постоянной, которое при необходимости можно менять), а в ячейку В2 внесем формулу =$H$2*C2/A2. В ячейки D2 и Е2 помещаем значения шага для изменения давления и температуры в соответствующем масштабе - 0,2 и 0,05.
Теперь займемся формированием графической области. Предполагается, что программные коды будут составлены таким образом, чтобы, изменяя с определенным шагом давление или температуру, автоматически заполнялись все столбцы, характеризующие состояние газа. Под значения давления нами отведен столбец А, под объем - столбец В, а под температуру - С. Первая строка, в которую будут занесены вычисленные значения, - строка 3. Следовательно, для построения графиков мы должны использовать эти три столбца.
Полагаем, что мы будем проводить вычисления до строки 250, это значение выбрано, исходя из возможности построения до 25 различных процессов с длительностью каждого в 10 шагов. Используя стандартные средства электронной таблицы, создадим три диаграммы типа "Точечная", которые имеют следующие исходные данные:
- диаграмма P-V: значения Х - В2:В250, значения Y - А2:А250;
- диаграмма V-T: значения X - C2:C250, значения Y - В2:В250;
- и диаграмма Р-Т: Х - C2:C250, Y - А2:А250.
Если параметры диаграмм заданы правильно, то на каждой из них можно будет увидеть точку, перемещающуюся при изменении положения ползунков на полосах прокрутки.
Теперь приступаем к созданию элементов управления. Для внешнего оформления располагаем на рабочем листе четыре элемента управления TextBox или Label, в которых просто поместим текстовую информацию: соответственно "Изменение положения начальной точки", "Изобара", "Изотерма", "Изохора" (см. рис. 1). Внешнее оформление этих элементов - дело вкуса.
Рис. 1. Компоновка элементов управления на листе Microsoft Excel
Затем там же размещаем семь элементов CommandButton (Кнопка), при щелчке на которые и будут запускаться соответствующие подпрограммы. Не будем тратить время на переименование этих элементов и согласимся с тем, что по умолчанию предлагает VBA, запомнив лишь, что кнопки 1 и 2 (CommandButton1 и CommandButton2) будут относиться к изотерме, 3 и 4 - к изобаре, 5 и 6 - к изохоре. Свойство Caption у этих кнопок нужно изменить таким образом, чтобы указать направление изменения соответствующего параметра. Для изотермы будем либо увеличивать (символ "^"), либо уменьшать давление, для изобары и изохоры соответственно меняем температуру. Необходимо отметить, что это соответствует реальным способам создания этих процессов.
Не забудем и еще об одном элементе управления с надписью "Очистка", назначение которого - инициализация переменных начальными значениями. Еще раз обратите внимание на рис. 1, где изображена компоновка элементов.
Теперь пришла пора писать коды подпрограмм.
Позаботимся о создании начальных условий, необходимых для начала построения графиков: на диаграмме изображена только одна точка, а все ячейки блока А2:С250 - пустые. Перейдем в окно редактора VBA (например, двойным щелчком по кнопке CommandButton7 или другим способом) и создадим в модуле для 1-го листа (на котором размещены все наши элементы управления) процедуру
Private Sub CommandButton7_Click()
Range("a3:c250").Clear
stroka = 2
End Sub
В этой процедуре, во-первых, очищаются ячейки указанного блока, а во-вторых, определяется переменная stroka, указывающая текущий номер строки, для которой производятся вычисления. Она должна быть доступной для всех процедур, поэтому ее необходимо объявить как глобальную переменную. Для этого в блоке General, в разделе Declarations, набираем
Dim stroka As Integer
Следующий шаг - расчет какого-либо процесса и заполнение ячеек столбцов А-С с последующим построением соответствующих диаграмм. Для примера рассмотрим вариант расчета изотермического процесса с возрастанием давления. В этом случае из последней заполненной строки (определяется переменной stroka) в переменную р пересылаем значение из ячейки столбца давлений (А) и одновременно увеличиваем эту переменную на величину шага, которая хранится в D2 (2-я строка, 4-й столбец). Получаем следующую строку кода
p = Cells(stroka, 1) + Cells(2, 4)
По формуле (6) для изотермического процесса вычисляем новый объем. Для этого, помимо "нового" давления, необходимы значение температуры (та же строка, столбец 3) и газовая постоянная (ячейка Н2 - строка 2, столбец 8). "Новый" объем помещаем в следующую строку столбца 2. Строка кода выглядит так:
Cells(stroka + 1, 2) = Cells(2, 8) * Cells(stroka, 3) / p
Наступила пора увеличить переменную stroka на единицу -
stroka = stroka + 1
и в "новую" строку перенести значения температуры и давления -
Cells(stroka, 3) = Cells(stroka - 1, 3)
Cells(stroka, 1) = p
Чтобы отобразить новые данные в диаграммах, необходимо вставить команду "Делай событие"
DoEvents
Получившийся набор команд полезно оформить в виде отдельной процедуры. Дадим ей имя termab и, используя в редакторе VBA команду меню Insert/Procedure, создаем следующую процедуру:
Public Sub termab()
p = Cells(stroka, 1) + Cells(2, 4)
Cells(stroka + 1, 2) = _
Cells(2, 8) * Cells(stroka, 3) / p
stroka = stroka + 1
Cells(stroka, 3) = Cells(stroka - 1, 3)
Cells(stroka, 1) = p
DoEvents
End Sub
Почти так же будет выглядеть процедура для изотермического процесса, если давление нужно уменьшать, только здесь необходимо позаботиться о том, чтобы она выполнялась, если давление больше 0,5 (?100 кПа). Имя процедуры - termam, и выглядит она так:
Public Sub termam()
p = Cells(stroka, 1)
If p > 0.5 Then
p = p - Cells(2, 4)
Cells(stroka + 1, 2) = Cells(2, 8) * Cells(stroka, 3) / p
stroka = stroka + 1
Cells(stroka, 3) = Cells(stroka - 1, 3)
Cells(stroka, 1) = p
DoEvents
End If
End Sub
Процедуры для реализации изобарического процесса (температура вверх - izobb и температура вниз - izobm) отличаются тем, что происходят считывание, оценка и изменение температуры (переменная t), расчет объема по формуле (3) и перенос без изменения в следующую строку давления.
Public Sub izobb()
t = Cells(stroka, 3) + Cells(2, 5)
Cells(stroka + 1, 2) = Cells(2, 8) / Cells(stroka, 1) * t
stroka = stroka + 1
Cells(stroka, 1) = Cells(stroka - 1, 1)
Cells(stroka, 3) = t
DoEvents
End Sub
Public Sub izobm()
t = Cells(stroka, 3)
If t > 0.5 Then
t = t - Cells(2, 5)
Cells(stroka + 1, 2) = Cells(2, 8) / Cells(stroka, 1) * t
stroka = stroka + 1
Cells(stroka, 1) = Cells(stroka - 1, 1)
Cells(stroka, 3) = t
DoEvents
End If
End Sub
Для изохорного процесса (izoxb и izoxm) по сравнению с двумя предыдущими процедурами изменена расчетная формула. Здесь вычисляется новое давление по формуле (5), а объем остается без изменения.
Public Sub izoxb()
t = Cells(stroka, 3) + Cells(2, 5)
Cells(stroka + 1, 1) = Cells(2, 8) / Cells(stroka, 2) * t
stroka = stroka + 1
Cells(stroka, 2) = Cells(stroka - 1, 2)
Cells(stroka, 3) = t
DoEvents
End Sub
Public Sub izoxm()
t = Cells(stroka, 3)
If t > 0.5 Then
t = t - Cells(2, 5)
Cells(stroka + 1, 1) = Cells(2, 8) / Cells(stroka, 2) * t
stroka = stroka + 1
Cells(stroka, 2) = Cells(stroka - 1, 2)
Cells(stroka, 3) = t
DoEvents
End If
End Sub
Теперь позаботимся о том, чтобы для каждого изопроцеcса процедура выполнялась десять раз подряд, то есть заполнялись 10 новых строчек. Вот здесь нам и понадобятся 6 кнопок CommandButton. Для первой кнопки под событие "Щелчок по кнопке" мы создаем следующую процедуру
Private Sub CommandButton1_Click()
For i = 1 To 10
termab
Next
End Sub
Остальные процедуры будут запускаться оставшимися пятью кнопками.
Теперь, выключив режим конструктора и щелкнув предварительно по кнопке "Очистить", выбираем с помощью полос прокрутки начальное положение точки где-то в середине графика P-V и строим различные цепочки изопроцессов и термодинамические циклы.
Поговорим более подробно о том, как в этом же проекте можно проиллюстрировать первое начало термодинамики. Вернемся к физике. Как известно, первое начало имеет вид
Q = A + DU,
где Q - количество теплоты, подведенное к газу,
А - работа, совершенная газом в процессе,
DU - изменение внутренней энергии газа.
Для вычисления работы в различных процессах используются разные формулы, но основная формула имеет вид
A = P*DV,
где DV - изменение объема.
Именно эту формулу мы будем использовать, полагая, что в исследуемых нами процессах шаг расчетов настолько мал, что давление при полученном изменении объема можно считать постоянным. Вообще-то это допущение необходимо только для изотермического процесса, потому что там одновременно меняется и объем, и давление. Изменение внутренней энергии будем вычислять по формуле DU = CmDT, или, не вдаваясь в подробности преобразования,
DU = kR0DT = kR0T2 - kR0T1 .
Коэффициент k определяется природой газа, строением его молекул, и в наших расчетах полагаем, что этот коэффициент равен 2 (ячейка P1). Кроме того, запишем следующую формулу:
DU = kR0T2 -U1 ,
где U1 - внутренняя энергия газа в начальном состоянии.
Таким образом, расчеты можно проводить по следующей схеме. Определяем U1 по начальным параметрам газа, затем, используя значение температуры для произвольного состояния, можем найти DU. Так как значение работы зависит от того, какой процесс происходит с газом, то здесь необходимо производить суммирование работ, совершенных газом на каждом шаге, поэтому в одном из столбцов таблицы в каждой строке будем производить сложение предыдущей строки с работой, выполненной на этом шаге. Рядом будет располагаться столбец, в котором складывается работа газа и изменение его внутренней энергии, значения которого берем еще из одного столбца. Теперь, согласно этой схеме, можно внести формулы в электронную таблицу. Фрагмент заполнения показан в табл. 2.
Необходимо напомнить, что в этих формулах rrr - имя ячейки H2, в которой хранится R0 .
В качестве диаграммы, на которой можно наблюдать соотношение между этими термодинамическими параметрами, используем обычную гистограмму с тремя рядами данных. Первый ряд будет отображать изменение внутренней энергии газа для последней расчетной точки, второй - значение работы, а третий - количество теплоты. Для этих рядов назначаем по одной ячейке - M5, N5 и O5 соответственно. Теперь, чтобы диаграмма отображала данные текущей точки, мы должны позаботиться о том, чтобы в эти ячейки при каждом пересчете переносились значения DU, A, Q из столбцов S, R и T, взятые из последней рассчитанной строки. С этой целью дополняем нашу программу процедурой termod
Public Sub termod()
Cells(5, 14) = Cells(stroka, 18)
Cells(5, 13) = Cells(stroka, 19)
Cells(5, 15) = Cells(stroka, 20)
End Sub.
Вызов этой процедуры будем осуществлять во всех шести процедурах для командных кнопок (CommandButton1_Click() - CommandButton2_Click()) перед строкой Next.
Теперь при запуске программы на диаграмме можно на блюдать изменение размеров столбиков в зависимости от значения термодинамических параметров. В качестве контроля правильности работы программы можно использовать тот общеизвестный факт, что для замкнутых циклов, соответствующих изображенным на рис. 2, изменение внутренней энергии равно нулю при полном завершении цикла.
Рис. 2. Примеры работы программы
Безусловно, этот проект может быть усовершенствован рядом дополнений, например, можно добавить счетчик цепочек процессов, ввести дополнительные ограничения на максимальные значения температуры, объема, давления и т.д.
Но важнее другое. Удачное, на наш взгляд, сочетание возможностей ЭТ и программирования открывает большие перспективы для наглядного моделирования разнообразных природных процессов.
|
A |
B |
C |
... |
R |
S |
T |
1 |
=PPP * 100 |
=VVV |
=TTT * 100 |
|
A |
DU |
Q |
2 |
|
|
|
|
|
= $P$1 * rrr * C2 |
|
3 |
|
|
|
|
=A3 * (B3 - B2) + R2 |
= $P$1 * rrr * C3 - $S$2 |
= R3 + S3 |
... |
|
|
|
|
... |
... |
... |
7 |
|
|
|
|
=A7 * (B7 - B6) + R6 |
= $P$1 * rrr * C7 - $S$2 |
= R7 + S7 |
8 |
|
|
|
|
=A8 * (B8 - B7) + R7 |
= $P$1 * rrr * C8 - $S$2 |
= R8 + S8 |
... |
|
|
|
|
... |
... |
... |